<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>date_histogram 聚合 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'search-aggregations-bucket-datehistogram-aggregation.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations-bucket-datehistogram-aggregation.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations-bucket-datehistogram-aggregation.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/search-aggregations-bucket-datehistogram-aggregation.html" rel="nofollow" target="_blank">../en/search-aggregations-bucket-datehistogram-aggregation.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations.html">聚合</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations-bucket.html">桶(bucket)聚合</a></span>
»
<span class="breadcrumb-node">date_histogram 聚合</span>
</div>
<div class="navheader">
<span class="prev">
<a href="search-aggregations-bucket-composite-aggregation.html">« composite 聚合</a>
</span>
<span class="next">
<a href="search-aggregations-bucket-daterange-aggregation.html">date_range 聚合 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="search-aggregations-bucket-datehistogram-aggregation"></a>日期直方图(date_histogram)聚合
</h2>
</div></div></div>
<p>
这种多桶聚合类似于普通的<a class="xref" href="search-aggregations-bucket-histogram-aggregation.html" title="直方图聚合" rel="nofollow">直方图(histogram)聚合</a>，但它只能用于日期或日期范围值。

因为 Elasticsearch 中的日期在内部用长整形表示，所以也可以对日期使用普通<code class="literal">histogram</code>聚合，但不够精确。

这两个API的主要区别在于，日期直方图可以使用日期/时间表达式来指定时间间隔。

基于时间的数据需要特殊的支持，因为基于时间的间隔并不总是固定的长度。
</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="calendar_and_fixed_intervals"></a>日历和固定间隔值
</h3>
</div></div></div>
<p>配置日期直方图聚合时，可以通过两种方式指定时间间隔：日历感知(calendar-aware)时间间隔和固定(fixed)时间间隔。</p>
<p>日历感知间隔知道夏令时改变特定日子的长度，月份有不同的天数，闰秒可以附加到特定的年份。</p>
<p>相比之下，固定间隔始终是SI(国际)单位的倍数，并且不会根据日历上下文改变。</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<h3>组合的<code class="literal">interval</code>字段已弃用</h3>
<p><span class="Admonishment Admonishment--change">
[<span class="Admonishment-version u-mono u-strikethrough">7.2</span>]
<span class="Admonishment-detail">
在7.2版本中废弃。 <code class="literal">interval</code>字段已废弃
</span>
</span>
过去，日历和固定时间间隔都是在一个 <code class="literal">interval</code> 字段中配置的，这导致了语义混乱。

指定 <code class="literal">1d</code> 会被认为是一个日历感知时间，而 <code class="literal">2d</code> 却被解释为一个固定时间。

要获得固定时间类型的“一天”，用户需要指定下一个更小的单位(在本例中是<code class="literal">24h</code>)。
</p>
<p>这种组合行为对于用户来说通常是未知的，即使知道这种行为，也很难使用且容易混淆。</p>
<p>这种行为已被弃用，取而代之的是两个新的显式字段：<code class="literal">calendar_interval</code> 和 <code class="literal">fixed_interval</code>。</p>
<p>
通过预先在日历和间隔之间进行选择，时间间隔的语义对用户来说是一目了然的，不会有歧义。

旧的<code class="literal">interval</code>字段会在将来移除。
</p>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="calendar_intervals"></a>日历间隔
</h4>
</div></div></div>
<p>
日历感知间隔是用参数 <code class="literal">calendar_interval</code> 配置的。

日历间隔只能以单位的“单数”数量指定(<code class="literal">1d</code>、<code class="literal">1M</code>等)。

不支持像 <code class="literal">2d</code>这样的倍数，否则会引发异常。
</p>
<p>日历间隔可用的单位有：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
分钟 (<code class="literal">1m</code>)
</span>
</dt>
<dd>
所有的分钟都从00秒开始。一分钟是指定时区中第一分钟的00秒和下一分钟的00秒之间的时间间隔，用于补偿任何介于其间的闰秒，因此整点后的分钟数和秒数在开始和结束时是相同的。
</dd>
<dt>
<span class="term">
小时 (<code class="literal">1h</code>)
</span>
</dt>
<dd>
所有的小时都从00分00秒开始。一个小时(1h)是指定时区中第一个小时的00:00分钟和下一个小时的00:00分钟之间的间隔，用于补偿任何介于其间的闰秒，以便在开始和结束时超过该小时的分钟数和秒数是相同的。
</dd>
<dt>
<span class="term">
天 (<code class="literal">1d</code>)
</span>
</dt>
<dd>
所有的天都在尽可能早的时间开始，通常是00:00:00(午夜)。一天(1d)是指定时区中一天开始和下一天开始之间的时间间隔，用于补偿任何中间的时间变化。
</dd>
<dt>
<span class="term">
星期 (<code class="literal">1w</code>)
</span>
</dt>
<dd>
一周是指定时区中 一周的开始日:小时:分钟:秒(day_of_week:hour:minute:second) 与下一周的同一天和时间之间的间隔。
</dd>
<dt>
<span class="term">
月 (<code class="literal">1M</code>)
</span>
</dt>
<dd>
一个月是指定时区中一个月的开始日期和时间与下一个月的同一天和时间之间的间隔，因此一个月的开始日期和时间是相同的。
</dd>
<dt>
<span class="term">
季度 (<code class="literal">1q</code>)
</span>
</dt>
<dd>
一个季度(1q)是一个月的开始日期和一天中的时间与三个月后的同一天和一天中的时间之间的间隔，因此一个月的开始日期和结束日期是相同的。
</dd>
<dt>
<span class="term">
年 (<code class="literal">1y</code>)
</span>
</dt>
<dd>
一年(1y)是指定时区中一个月的开始日期和时间与下一年的同一天和时间之间的间隔，因此开始和结束时的日期和时间是相同的。
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="calendar_interval_examples"></a>日历间隔的示例
</h4>
</div></div></div>
<p>例如，下面是请求以日历时间中的一个月为桶间隔的聚合：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /sales/_search?size=0
{
    "aggs" : {
        "sales_over_time" : {
            "date_histogram" : {
                "field" : "date",
                "calendar_interval" : "month"
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/441.console"></div>
<p>如果尝试使用日历单位的倍数，聚合就会失败，因为仅支持单个日历单位:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /sales/_search?size=0
{
    "aggs" : {
        "sales_over_time" : {
            "date_histogram" : {
                "field" : "date",
                "calendar_interval" : "2d"
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/442.console"></div>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
  "error" : {
    "root_cause" : [...],
    "type" : "x_content_parse_exception",
    "reason" : "[1:82] [date_histogram] failed to parse field [calendar_interval]",
    "caused_by" : {
      "type" : "illegal_argument_exception",
      "reason" : "The supplied interval [2d] could not be parsed as a calendar interval.",
      "stack_trace" : "java.lang.IllegalArgumentException: The supplied interval [2d] could not be parsed as a calendar interval."
    }
  }
}</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="fixed_intervals"></a>固定间隔
</h4>
</div></div></div>
<p>固定间隔是用参数 <code class="literal">fixed_interval</code> 配置的。</p>
<p>
与日历感知间隔不同，固定间隔是固定数量的国际单位制(SI)单位，无论它们在日历上的位置如何，都不会偏离。

一秒钟总是由1000毫秒组成。

这允许以支持单位的任何倍数值指定固定间隔。
</p>
<p>
然而，这意味着固定的间隔不能表达其他单位，如“月(month)”，因为一个月的持续时间不是一个固定的量。

试图指定月或季度(quarter)等日历间隔将引发异常。
</p>
<p>固定间隔支持的单位有：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
毫秒 (ms)
</span>
</dt>
<dt>
<span class="term">
秒 (s)
</span>
</dt>
<dd>
定义为每个1000毫秒
</dd>
<dt>
<span class="term">
分钟 (m)
</span>
</dt>
<dd>
所有分钟都从00秒开始。
定义为每个60秒(60,000毫秒)
</dd>
<dt>
<span class="term">
小时 (h)
</span>
</dt>
<dd>
所有小时都从00分00秒开始。
定义为每60分钟(3,600,000毫秒)
</dd>
<dt>
<span class="term">
天 (d)
</span>
</dt>
<dd>
所有天都在尽可能早的时间开始，通常是00:00:00(午夜)。
定义为24小时(86,400,000毫秒)
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="fixed_interval_examples"></a>固定价格的示例
</h4>
</div></div></div>
<p>如果我们尝试重新创建之前的<code class="literal">calendar_interval</code>的“月”，我们可以用30天的固定天数来近似：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /sales/_search?size=0
{
    "aggs" : {
        "sales_over_time" : {
            "date_histogram" : {
                "field" : "date",
                "fixed_interval" : "30d"
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/443.console"></div>
<p>但是，如果我们尝试使用不支持的日历单位，如“周(w)”，就会得到一个异常：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /sales/_search?size=0
{
    "aggs" : {
        "sales_over_time" : {
            "date_histogram" : {
                "field" : "date",
                "fixed_interval" : "2w"
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/444.console"></div>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
  "error" : {
    "root_cause" : [...],
    "type" : "x_content_parse_exception",
    "reason" : "[1:82] [date_histogram] failed to parse field [fixed_interval]",
    "caused_by" : {
      "type" : "illegal_argument_exception",
      "reason" : "failed to parse setting [date_histogram.fixedInterval] with value [2w] as a time value: unit is missing or unrecognized",
      "stack_trace" : "java.lang.IllegalArgumentException: failed to parse setting [date_histogram.fixedInterval] with value [2w] as a time value: unit is missing or unrecognized"
    }
  }
}</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_notes_8"></a>注意
</h4>
</div></div></div>
<p>在任何情况下，当指定的结束时间不存在时，实际结束时间是指定结束时间后最近的可用时间。</p>
<p>
广泛发布的应用程序还必须考虑一些不确定因素，比如一些国家在12点01分开始和停止夏令时，因此每年都会有一分钟是周日，然后接下来的59分钟又回到了周六，以及一些国家决定跨越国际日期变更线。 

这种情况使得不规则时区偏移看起来很容易。
</p>
<p>
与往常一样，严格的测试，尤其是围绕时间变化事件，将确保你的时间间隔规格是你想要的。
</p>
<p>
警告：为避免意外结果，所有连接的服务器和客户端都必须同步到可靠的网络时间服务。
</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
不支持带小数点的时间值，但是可以通过转换到另一个时间单位来解决这个问题(例如，可以将<code class="literal">1.5h</code>指定为<code class="literal">90m</code>)。
</p>
</div>
</div>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>还可以使用<a class="xref" href="common-options.html#time-units" title="时间单位" rel="nofollow">时间单位</a>解析支持的缩写来指定时间值。</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_keys_2"></a>key
</h4>
</div></div></div>
<p>
在内部，日期被表示为一个64位的数字，该数字表示一个以毫秒为单位的时间戳，该时间戳自UTC时间1970/1/1午夜开始。

这些时间戳作为桶的 <code class="literal">key</code> 返回。

<code class="literal">key_as_string</code> 是一个使用参数<code class="literal">format</code>规范转换为格式化的日期字符串的相同的时间戳：
</p>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>
如果未指定 <code class="literal">format</code>，将使用字段映射中指定的第一个日期 <a class="xref" href="mapping-date-format.html" title="format" rel="nofollow">格式</a>。
</p>
</div>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /sales/_search?size=0
{
    "aggs" : {
        "sales_over_time" : {
            "date_histogram" : {
                "field" : "date",
                "calendar_interval" : "1M",
                "format" : "yyyy-MM-dd" <a id="CO220-1"></a><i class="conum" data-value="1"></i>
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/445.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO220-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>支持<a class="xref" href="search-aggregations-bucket-daterange-aggregation.html#date-format-pattern" title="日期 格式/模式" rel="nofollow">日期格式模式</a>表达式</p>
</td>
</tr>
</table>
</div>
<p>响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
    ...
    "aggregations": {
        "sales_over_time": {
            "buckets": [
                {
                    "key_as_string": "2015-01-01",
                    "key": 1420070400000,
                    "doc_count": 3
                },
                {
                    "key_as_string": "2015-02-01",
                    "key": 1422748800000,
                    "doc_count": 2
                },
                {
                    "key_as_string": "2015-03-01",
                    "key": 1425168000000,
                    "doc_count": 2
                }
            ]
        }
    }
}</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_timezone"></a>时区
</h4>
</div></div></div>
<p>
日期时间以 UTC 存储在 Elasticsearch 中。

默认情况下，所有的分桶和舍入也在 UTC 中完成。

<code class="literal">time_zone</code> 参数可用于指示分桶时应该使用不同的时区。
</p>
<p>
时区可以指定为 ISO 8601 UTC 时差(例如<code class="literal">+01:00</code> 或 <code class="literal">-08:00</code>)，也可以指定为时区id(在TZ数据库中使用的标识符)，比如<code class="literal">America/Los_Angeles</code>。
</p>
<p>看下面的例子：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT my_index/_doc/1?refresh
{
  "date": "2015-10-01T00:30:00Z"
}

PUT my_index/_doc/2?refresh
{
  "date": "2015-10-01T01:30:00Z"
}

GET my_index/_search?size=0
{
  "aggs": {
    "by_day": {
      "date_histogram": {
        "field":     "date",
        "calendar_interval":  "day"
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/446.console"></div>
<p>
如果不指定时区，则使用UTC。

这将导致这两个文档被放入同一天的桶中，该桶从UTC时间2015年10月1日午夜开始：
</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  ...
  "aggregations": {
    "by_day": {
      "buckets": [
        {
          "key_as_string": "2015-10-01T00:00:00.000Z",
          "key":           1443657600000,
          "doc_count":     2
        }
      ]
    }
  }
}</pre>
</div>
<p>如果指定了 <code class="literal">time_zone</code> 为 <code class="literal">-01:00</code>，则该时区中的午夜比UTC的午夜早一个小时：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET my_index/_search?size=0
{
  "aggs": {
    "by_day": {
      "date_histogram": {
        "field":     "date",
        "calendar_interval":  "day",
        "time_zone": "-01:00"
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/447.console"></div>
<p>现在，第一份文件落入2015年9月30日的桶中，而第二份文件落入2015年10月1日的桶中：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  ...
  "aggregations": {
    "by_day": {
      "buckets": [
        {
          "key_as_string": "2015-09-30T00:00:00.000-01:00", <a id="CO221-1"></a><i class="conum" data-value="1"></i>
          "key": 1443574800000,
          "doc_count": 1
        },
        {
          "key_as_string": "2015-10-01T00:00:00.000-01:00", <a id="CO221-2"></a><i class="conum" data-value="1"></i>
          "key": 1443661200000,
          "doc_count": 1
        }
      ]
    }
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO221-1"><i class="conum" data-value="1"></i></a><a href="#CO221-2"></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">key_as_string</code>的值表示指定时区中每天的午夜。</p>
</td>
</tr>
</table>
</div>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
当使用随DST(夏令时)变化的时区时，接近这些变化发生时刻的桶的大小可能会与你预期要用的<code class="literal">interval</code>略有不同。

例如，考虑在<code class="literal">CET</code>时区开始夏令时：2016年3月27日凌晨2点，时钟拨快1小时至当地时间凌晨3点。

如果使用 <code class="literal">day</code> 作为 <code class="literal">interval</code>，则覆盖该天的桶将只保存23小时的数据，而不是其他桶通常的24小时。

对于较短的时间间隔也是如此，比如12小时，在3月27日早上DST转换发生时，桶里只有11个小时。
</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="search-aggregations-bucket-datehistogram-offset"></a>时差(offset)
</h4>
</div></div></div>
<p>
使用 <code class="literal">offset</code> 参数按指定的正(<code class="literal">+</code>)或负(<code class="literal">-</code>)偏移量持续时间来更改每个桶的起始值，例如<code class="literal">1h</code>表示一个小时，<code class="literal">1d</code>表示一天。

有关更多可能的持续时间选项，请参见<a class="xref" href="common-options.html#time-units" title="时间单位" rel="nofollow">时间单位(time units)</a>。
</p>
<p>
例如，当使用<code class="literal">day</code>作为时间间隔时，每个桶的时间区间从午夜到午夜。

将参数 <code class="literal">offset</code> 设置为 <code class="literal">+6h</code> 会将每个桶的时间区间更改为从早上6点到早上6点：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT my_index/_doc/1?refresh
{
  "date": "2015-10-01T05:30:00Z"
}

PUT my_index/_doc/2?refresh
{
  "date": "2015-10-01T06:30:00Z"
}

GET my_index/_search?size=0
{
  "aggs": {
    "by_day": {
      "date_histogram": {
        "field":     "date",
        "calendar_interval":  "day",
        "offset":    "+6h"
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/448.console"></div>
<p>上面的请求的每个桶不是从午夜开始，而是从早上6点开始：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  ...
  "aggregations": {
    "by_day": {
      "buckets": [
        {
          "key_as_string": "2015-09-30T06:00:00.000Z",
          "key": 1443592800000,
          "doc_count": 1
        },
        {
          "key_as_string": "2015-10-01T06:00:00.000Z",
          "key": 1443679200000,
          "doc_count": 1
        }
      ]
    }
  }
}</pre>
</div>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>在进行 <code class="literal">time_zone</code> 调整后，计算每个桶的起始 <code class="literal">offset</code>。</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_keyed_response_3"></a>keyed 响应
</h4>
</div></div></div>
<p>将 <code class="literal">keyed</code> 标志设置为 <code class="literal">true</code>，会将唯一的字符串键与每个桶相关联，并将范围作为哈希而不是数组返回：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /sales/_search?size=0
{
    "aggs" : {
        "sales_over_time" : {
            "date_histogram" : {
                "field" : "date",
                "calendar_interval" : "1M",
                "format" : "yyyy-MM-dd",
                "keyed": true
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/449.console"></div>
<p>响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
    ...
    "aggregations": {
        "sales_over_time": {
            "buckets": {
                "2015-01-01": {
                    "key_as_string": "2015-01-01",
                    "key": 1420070400000,
                    "doc_count": 3
                },
                "2015-02-01": {
                    "key_as_string": "2015-02-01",
                    "key": 1422748800000,
                    "doc_count": 2
                },
                "2015-03-01": {
                    "key_as_string": "2015-03-01",
                    "key": 1425168000000,
                    "doc_count": 2
                }
            }
        }
    }
}</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_scripts_2"></a>脚本
</h4>
</div></div></div>
<p>
与普通 <a class="xref" href="search-aggregations-bucket-histogram-aggregation.html" title="直方图聚合" rel="nofollow">histogram 聚合</a>一样，文档级脚本和值级脚本都是支持的。

你可以使用 <code class="literal">order</code> 设置控制返回的桶的顺序，并根据 <code class="literal">min_doc_count</code> 设置过滤返回的桶(默认情况下，将返回第一个与文档匹配的桶和最后一个桶之间的所有桶)。

该直方图还支持 <code class="literal">extended_bounds</code> 设置，该设置允许将直方图的边界扩展到数据本身之外。

更多信息请参考<a class="xref" href="search-aggregations-bucket-histogram-aggregation.html#search-aggregations-bucket-histogram-aggregation-extended-bounds" rel="nofollow"><code class="literal">扩展的边界</code></a>。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_missing_value_14"></a>缺失的值
</h4>
</div></div></div>
<p>
参数 <code class="literal">missing</code> 定义了如何处理缺少值的文档。

默认情况下，它们被忽略，但是也可以将它们视为有一个值。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /sales/_search?size=0
{
    "aggs" : {
        "sale_date" : {
             "date_histogram" : {
                 "field" : "date",
                 "calendar_interval": "year",
                 "missing": "2000/01/01" <a id="CO222-1"></a><i class="conum" data-value="1"></i>
             }
         }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/450.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO222-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">publish_date</code> 字段没有值的文档将与 <code class="literal">2000-01-01</code>落入同一个桶。</p>
</td>
</tr>
</table>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_order_2"></a>排序(order)
</h4>
</div></div></div>
<p>
默认情况下，返回的桶按照他们的 <code class="literal">key</code> 升序排列，但是你可以使用 <code class="literal">order</code> 设置来控制排序。

此设置支持与<a class="xref" href="search-aggregations-bucket-terms-aggregation.html#search-aggregations-bucket-terms-aggregation-order" title="排序" rel="nofollow"><code class="literal">terms 聚合</code></a>相同的 <code class="literal">order</code> 功能。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_using_a_script_to_aggregate_by_day_of_the_week"></a>使用脚本按某一天是一周中的第几天进行聚合
</h4>
</div></div></div>
<p>当你需要按某一天是一周中的第几天汇总结果时，请使用返回某一天是一周中的第几天的脚本：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /sales/_search?size=0
{
    "aggs": {
        "dayOfWeek": {
            "terms": {
                "script": {
                    "lang": "painless",
                    "source": "doc['date'].value.dayOfWeekEnum.value"
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/451.console"></div>
<p>响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  ...
  "aggregations": {
    "dayOfWeek": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "7",
          "doc_count": 4
        },
        {
          "key": "4",
          "doc_count": 3
        }
      ]
    }
  }
}</pre>
</div>
<p>响应将包含以某一天是一周中的第几天为key的所有桶：1表示星期一，2表示星期二，...7表示星期天。</p>
</div>

</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="search-aggregations-bucket-composite-aggregation.html">« composite 聚合</a>
</span>
<span class="next">
<a href="search-aggregations-bucket-daterange-aggregation.html">date_range 聚合 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>